package com.huanzhidadi.single.stringformat;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringSubstitutor;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StringFormatTest {

    public static void main(String[] args) {
//        stringUtilsJoin();
//        stringJoin();
        messageFormat();
        messageFormat2();
        stringFormat();
        stringSubstitutor();
        stringSubstitutor2();
    }

    /**
     * StringUtils对字符串列表进行拼接
     */
    private static void stringUtilsJoin() {
        List<String> aaa = new ArrayList<>();
        aaa.add("a1");
        aaa.add("b4");
        String join = StringUtils.join(aaa, "/");
        System.out.println("stringUtilsJoin: " + join);
    }

    /**
     * String对字符串列表进行拼接
     */
    private static void stringJoin() {
        List<String> aaa = new ArrayList<>();
        aaa.add("a1");
        aaa.add("b4");
        String join = String.join("/", aaa);
        System.out.println("stringJoin: " + join);
    }

    /**
     * MessageFormat使用占位符{0} {1}格式化字符串，参数位置只和占位符的数字有关，从0开始计数
     */
    private static void messageFormat() {
        String name = "wang";
        Integer age = 33;
        String format = MessageFormat.format("姓名{1}，年龄{0}", age, name);
        System.out.println("messageFormat: " + format);
    }

    /**
     * MessageFormat使用占位符{0} {1}格式化字符串，参数位置只和占位符的数字有关，从0开始计数
     * 传入数组
     */
    private static void messageFormat2() {
        Object[] object = new Object[]{"wang", 33};
        String format = MessageFormat.format("姓名{0}，年龄{1}", object);
        System.out.println("messageFormat2: " + format);
    }


    /**
     * String使用占位符%s %d格式化字符串，参数位置需要固定
     * 支持一定的格式化操作
     * %03d的方式把不足三位的数字用前补零的方式补足三位去显示
     * %3d的方式把不足三位的数字用前补空格的方式补足三位去显示
     */
    private static void stringFormat() {
        String name = "wang";
        Integer age = 33;
        String format = String.format("姓名%5s，年龄%05d", name, age);
        System.out.println("stringFormat: " + format);
    }

    /**
     * StringSubstitutor使用占位符${key}格式化字符串，与传入的Map的key有关
     * 传入Map
     * 需引入org.apache.commons 的 commons-text包
     */
    private static void stringSubstitutor() {
        Map<String, String> replaceValue = new HashMap();
        replaceValue.put("name", "wang");
        replaceValue.put("age", "33");
        String format = StringSubstitutor.replace("姓名${name}，年龄${age}", replaceValue);
        System.out.println("stringSubstitutor: " + format);
    }

    /**
     * StringSubstitutor使用占位符${key}格式化字符串，与传入的Map的key有关
     * 自定义匹配符
     * 如果字符串中的变量形式不是 ${}，而是"$()"，StrSubstitutor提供了不同的构造器以及setVariablePrefix(char)，setVariableSuffix(char)等方法自定义匹配符。
     */
    private static void stringSubstitutor2() {
        Map<String, String> replaceValue = new HashMap();
        replaceValue.put("name", "wang");
        replaceValue.put("age", "33");
        String template = "姓名&(name)，年龄&(age)， &(undefined.number:-1234567890)";
        StringSubstitutor stringSubstitutor = new StringSubstitutor(replaceValue, "&(", ")", '&');
        String format = stringSubstitutor.replace(template);
        System.out.println("stringSubstitutor2: " + format);
    }

}
